//系统工具
package libs

import (
	//	"fmt"
	//	"io/ioutil"
	"os"
	"runtime"
	//	"strings"
	//	"syscall"

	"fmt"
	"github.com/astaxie/beego"
	"os/exec"
	"time"
)

var ostype = runtime.GOOS

type Diskstatus struct {
	All  uint64 `json:"all"`
	Used uint64 `json:"used"`
	Free uint64 `json:"free"`
}

//获取文件大小
func FileSize(file string) (int64, error) {
	f, e := os.Stat(file)
	if e != nil {
		return 0, e
	}
	return f.Size(), nil
}

//获取磁盘空间
func DiskUsage(path string) (disk Diskstatus) {
	//	if ostype == "windows" {

	//	} else if ostype == "linux" {
	//		fs := syscall.Statfs_t{}
	//		err := syscall.Statfs(path, &fs)
	//		if err != nil {
	//			beego.Error(err)
	//			return
	//		}
	//		disk.All = fs.Blocks * uint64(fs.Bsize)
	//		disk.Free = fs.Bfree * uint64(fs.Bsize)
	//		disk.Used = disk.All - disk.Free
	//	}

	return
}

//检查目录是否存在，若不存在则创建目录
//输入为路径名称
//返回为错误
func CheckPath(logPath string) error {
	//	dir := filepath.Dir(logPath)
	_, err := os.Stat(logPath)
	if err != nil {
		if os.IsNotExist(err) {
			err := os.MkdirAll(logPath, os.ModePerm)
			if err != nil {
				beego.Error("创建文件夹失败！：", err.Error())
				return err
			}
		}
	}
	beego.Info("文件夹已存在！")
	return nil
}

//在linux中执行mkdir命令，第一个参数name表示要创建的目录，path表示mkdir在哪个目录下工作,.表示当前目录
//返回标准输出和标准错误
//err不等于nil时，stdout不一定等于nil
func Mkdir(name, path string) (stdout []byte, err error) {
	cmd := exec.Command("mkdir", name)
	cmd.Dir = path
	stdout, err = cmd.CombinedOutput()
	return
}

//在linux中执行rm 命令，第一个参数name表示要删除的文件或目录（绝对路径），arg表示rm 运行参数
//返回标准输出和标准错误
//err不等于nil时，stdout不一定等于nil
func RemoveDir(name string, args ...string) (stdout []byte, err error) {
	cmd := exec.Command("rm", args...)
	cmd.Args = append(cmd.Args, name)
	stdout, err = cmd.CombinedOutput()
	return
}

//使用hugo命令创建新的网站
//dir 网站目录名
//返回标准输出和标准错误
//err不等于nil时，stdout不一定等于nil
func NewSite(dir string) (stdout []byte, err error) {
	cmd := exec.Command("hugo", "new", "site", dir)
	cmd.Dir = beego.AppConfig.String("WebRootDir")
	stdout, err = cmd.CombinedOutput()
	beego.Info(string(stdout))
	return
}

//使用hugo命令构建网站
//dir 网站目录名
//返回标准输出和标准错误
//err不等于nil时，stdout不一定等于nil
func Hugo(dir string) (stdout []byte, err error) {
	cmd := exec.Command("hugo")
	cmd.Dir = dir
	stdout, err = cmd.CombinedOutput()
	beego.Info(string(stdout))
	beego.Info(err)
	return
}

// 获取网站图片目录
// 如果不存在就自动创建它
func GetSiteImgDir(workspace string) (string, error) {
	year := time.Now().Year()
	month := time.Now().Month().String() //time.Now().Month().String()
	y := fmt.Sprint(year)
	dir := y + "-" + month
	fullPath := workspace + dir
	if err := CheckPath(fullPath); err != nil {
		return "", err
	}
	return dir, nil
}
